#include "camera.h"

namespace NEngine {

// ================================================================================================
// Mutators
// ================================================================================================

// ================================================================================================
// Set camera using vectors
// ================================================================================================
void CCamera::SetCamera(const Vector4& at_, const Vector4& up_, const Vector4& pos_) {
    at = at_;
    up = up_;
    pos = pos_;
    dirty = true;
}

// ================================================================================================
// Set camera using a matrix
// ================================================================================================
void CCamera::SetCamera(const Matrix4x4& mat) {
    left = mat.GetRow1();
    up = mat.GetRow2();
    at = mat.GetRow3();
    pos = mat.GetRow4(); 
    dirty = true;
}

// ================================================================================================
// Create the matrix for the camera
// ================================================================================================
void CCamera::ConstructMatrix() { 
    Matrix4x4 ident = Identity();
    Matrix4x4 ident1 = Identity();
    RotateX(xrot, ident1);
    Vector4 tempup = up * ident1;
    Vector4 tempat = at * ident1;
 
    RotateY(yrot, ident);
    tempup = tempup * ident;
    tempat = tempat * ident;
    Vector4 temppos = pos;

    if(handy == eLeftHand)
        left = CrossProduct(tempat, tempup);
    else if (handy == eRightHand) 
        left = CrossProduct(tempup, tempat);
    else
        left = CrossProduct(tempup, tempat);

    // -- store the world matrix
    mat.SetRow1(left);
    mat.SetRow2(tempup);
    mat.SetRow3(tempat);
    mat.SetRow4(pos);

    // -- create the view matrix
    viewmat = mat.Transpose3x3().GetRotation();

    temppos *= viewmat;

    viewmat.SetRow4(-temppos);
}

}